package org.example.loadBalancers;


import lombok.Getter;
import org.example.ServiceInstance;
import org.springframework.beans.factory.annotation.Value;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

//用于管理负载均衡器的上下文  给外部的接口 靠map实现   简单是外部给个配置就全局都一个负载均衡策略 高级是可以返回多个需要的负载均衡器 TODO 永远待完善 更多的负载均衡策略
public class LoadBalanceContext {

    //读取配置文件来设置全局负载均衡器 默认为轮询
    @Value("${my-nacos.discovery.loadBalancer:round}")
    private String loadBalancerName;


    //简单版本的 负载均衡器 直接根据配置文件来赋值  全局只用这一个 TODO 这个可以配合 按名称 来负载均衡
    @Getter
    private LoadBalancer loadBalancer;

    private final Map<String, LoadBalancer> loadBalancerMap = new HashMap<>();


    //提供一个方法 直接给默认的负载均衡器得到的服务实例
    public ServiceInstance getServiceInstance(String serviceName) {
        return loadBalancer.getServiceInstance(serviceName);
    }



    public void registerLoadBalancer(String serviceName, LoadBalancer loadBalancer) {
        loadBalancerMap.put(serviceName, loadBalancer);
    }

    //根据服务名获取负载均衡器 后续拓展可用
    public LoadBalancer getLoadBalancer(String serviceName) {
        return loadBalancerMap.get(serviceName);
    }

    @PostConstruct
    public void init() {
        this.loadBalancer = loadBalancerMap.get(loadBalancerName);
        System.out.println("初始化负载均衡器容器完成 数量：" + loadBalancerMap.size());
        System.out.println("装载的负载均衡器为：" + loadBalancer.getName());
    }
}
